package com.hanser.hancoder.config;

import com.hanser.hancoder.monitor.AiModelMonitorListener;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
import jakarta.annotation.Resource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import java.util.List;

@Configuration
@ConfigurationProperties(prefix = "langchain4j.open-ai.reasoning-streaming-chat-model")
@Data
public class ReasoningStreamingChatModelConfig {

    /**
     * 基础URL，用于指定OpenAI API的地址
     */
    private String baseUrl;

    /**
     * API密钥，用于认证访问OpenAI服务
     */
    private String apiKey;

    /**
     * 模型名称，指定要使用的OpenAI模型版本
     */
    private String modelName;

    /**
     * 最大令牌数，限制模型生成回复的最大长度
     */
    private Integer maxTokens;

    /**
     * 温度参数，控制生成文本的随机性
     * 值越高生成结果越随机，越低则越确定
     */
    private Double temperature;

    /**
     * 是否记录请求日志，默认为false
     */
    private Boolean logRequests = false;

    /**
     * 是否记录响应日志，默认为false
     */
    private Boolean logResponses = false;

    @Resource
    private AiModelMonitorListener aiModelMonitorListener;

    @Bean
    @Scope("prototype")
    public StreamingChatModel reasoningStreamingChatModelPrototype() {
        return OpenAiStreamingChatModel.builder()
                .apiKey(apiKey)
                .baseUrl(baseUrl)
                .modelName(modelName)
                .maxTokens(maxTokens)
                .temperature(temperature)
                .logRequests(logRequests)
                .logResponses(logResponses)
                .listeners(List.of(aiModelMonitorListener))
                .build();
    }
}

